/*
 * TM1640.c
 *
 *  Created on: May 22, 2022
 *      Author: LDSCITECHE
 */
#include "./tm1640.h"
#include "./applications/app_can_master.h"
extern struct can_dev_t *comm_dev;//通信设备
unsigned char CODE[16]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7c,0x39,0x5e,0x79,0x71};  //共阴数码管0~F字型码
/*
 ******************************************************************************
 * @brief     ( описание ):  функция для старта ( активации ) передачи данных на модуль
 * @param    ( параметры ):
 * @return  ( возвращает ):

 ******************************************************************************
 */
void TM1640_Generate_START(void)
{

    TM_SCL_H()
    ;
    TM_SDA_H()
    ;
    delay_us( DELAY_TIME);
    TM_SDA_L()
    ;
}
//----------------------------------------------------------------------------------

/*
 ******************************************************************************
 * @brief     ( описание ):  функция для конца отправки данных на модуль ( вызываеться по завершению )
 * @param    ( параметры ):
 * @return  ( возвращает ):

 ******************************************************************************
 */
void TM1640_Generate_STOP(void) {

    TM_SCL_L()
    ;
    delay_us( DELAY_TIME);
    TM_SDA_L()
    ;
    delay_us( DELAY_TIME);
    TM_SCL_H()
    ;
    delay_us( DELAY_TIME);
    TM_SDA_H()
    ;
}

/*
 ******************************************************************************
 * @brief     ( описание ):  функция отправки данных на модуль 1 байт
 * @param    ( параметры ):  1 байт информации
 * @return  ( возвращает ):

 ******************************************************************************
 */
void TM1640_WriteData(uint8_t oneByte) {
		uint8_t i;
    delay_us( DELAY_TIME);

    for (i = 0; i < 8; i++) {
        TM_SCL_L()
        ;

        if (oneByte & (1 << i)) {
            TM_SDA_H()
            ;
        } else {
            TM_SDA_L()
            ;
        }

        delay_us( DELAY_TIME);
        TM_SCL_H()
        ;
        delay_us( DELAY_TIME);
    }

    TM_SCL_L()
    ;
    delay_us( DELAY_TIME);
    TM_SDA_L()
    ;
    while( read_DIN ) {};
}


void tm1640_gpio_init(void)
{
	 GPIO_InitTypeDef GPIO_InitStruct;
  GPIO_StructInit(&GPIO_InitStruct); //初始化结构体
  
  GPIO_InitStruct.GPIO_Mode = GPIO_Mode_OUT; //GPIO输出模式
  GPIO_InitStruct.GPIO_Pin = TM_SCL_GPIO_Pin;
  GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_UP;
  GPIO_Init(TM_SCL_GPIO, &GPIO_InitStruct);
	
  GPIO_InitStruct.GPIO_Pin = TM_SDA_GPIO_Pin;
  GPIO_Init(TM_SDA_GPIO, &GPIO_InitStruct);
	



}

	
void tm1640_init(void)
{
    uint8_t i;
    tm1640_gpio_init();
    TM1640_Generate_START();
    TM1640_WriteData(0x40);//数据命令设置：普通模式，地址自动加一
    TM1640_Generate_STOP();
    TM1640_Generate_START();
    TM1640_WriteData(0xC0);
    for(i=0;i<16;i++)  //发送16位显示数据
    {
        TM1640_WriteData(CODE[0]);
    }
    TM1640_Generate_STOP();
    TM1640_Generate_START();
    TM1640_WriteData(0x8c);    //显示控制：显示开，脉冲宽度设为11/16
    TM1640_Generate_STOP();

}

 uint8_t tmp,tmp1,tmp2=0;

/**
 * @brief 数码管1 显示
 * 
 * @param value x10 值扩大10 
 * 
 * @param type 0 无小数点 1 有小数点
 */
void seg1_show(uint16_t value,uint8_t type)
{
   
    TM1640_Generate_START();
    TM1640_WriteData(0xC0);
    tmp=value/100;
    TM1640_WriteData(CODE[tmp]);
    tmp1=value/10%10;
    if(type==1)
    {
        TM1640_WriteData(CODE[tmp1]|0x80);
    }
    else
    {
        TM1640_WriteData(CODE[tmp1]);
    }
    tmp2=value%10;
    TM1640_WriteData(CODE[tmp2]);
    TM1640_Generate_STOP();
}

/**
 * @brief 数码管2 显示
 * 
 * @param value x10 值扩大10 
 */
void seg2_show(uint16_t value,uint8_t type)
{
    TM1640_Generate_START();
   TM1640_WriteData(0xC3);
    tmp=value/100;
    TM1640_WriteData(CODE[tmp]);
    tmp1=value/10%10;
    if(type==1)
    {
        TM1640_WriteData(CODE[tmp1]|0x80);
    }
    else
    {
        TM1640_WriteData(CODE[tmp1]);
    }
    tmp2=value%10;
    TM1640_WriteData(CODE[tmp2]);
    TM1640_Generate_STOP();
}

/**
 * @brief 数码管3 显示 ，电流需要2位小数点
 * 
 * @param value x10 值扩大10 
 */
void seg3_show(uint16_t value,uint8_t type)
{
    TM1640_Generate_START();
    TM1640_WriteData(0xC6);
    tmp=value/100;
	  if(type==1)
    {
        TM1640_WriteData(CODE[tmp]|0x80);
    }
    else
    {
        TM1640_WriteData(CODE[tmp]);
    }
    tmp1=value/10%10;
    TM1640_WriteData(CODE[tmp1]);
    tmp2=value%10;
    TM1640_WriteData(CODE[tmp2]);
    TM1640_Generate_STOP();

}

/**
 * @brief 数码管3 显示 电流需要2位小数点
 * 
 * @param value x10 值扩大10 
 */
void seg4_show(uint16_t value,uint8_t type)
{

    TM1640_Generate_START();
    TM1640_WriteData(0xC9);
    tmp=value/100;
	  if(type==1)
    {
        TM1640_WriteData(CODE[tmp]|0x80);
    }
    else
    {
        TM1640_WriteData(CODE[tmp]);
    }
    tmp1=value/10%10;
    TM1640_WriteData(CODE[tmp1]);
    tmp2=value%10;
    TM1640_WriteData(CODE[tmp2]);
    TM1640_Generate_STOP();

}
uint16_t test ;
void tm1640_handle(void)
{
   seg1_show(comm_dev->can_dev_list[0].mod_vout,1);//mod1 Vout
   seg2_show(comm_dev->can_dev_list[1].mod_vout,1);// mod2 Vout
	
   seg3_show(comm_dev->can_dev_list[0].mod_iout*10,1);// mod1 Iout
   seg4_show(comm_dev->can_dev_list[1].mod_iout*10,1);// mod2 Iout
	    
}
